#include "message.hpp"
#include "net.hpp"

void onMessage(const gmrpc::BaseConnection::ptr & conn, gmrpc::BaseMessage::ptr & msg)
{
    std::string body = msg->serialize();
    std::cout << body <<std::endl;
    auto rpc_rsp = gmrpc::MessageFactory::create<gmrpc::RpcResponse>();
    rpc_rsp->setId("11111");
    rpc_rsp->setMType(gmrpc::MType::RSP_RPC);
    rpc_rsp->setRCode(gmrpc::RCode::RCODE_OK);
    rpc_rsp->setResult(33);
    conn->send(rpc_rsp);
}

int main()
{
    auto server = gmrpc::ServerFactory::create(9090);
    server->setMessageCallback(onMessage);
    server->start();

    return 0;
}


// int main()
// {

//     // gmrpc::RpcRequest::ptr  rrp = gmrpc::MessageFactory::create<gmrpc::RpcRequest>();
//     // Json::Value param;
//     // param["nums1"] = 11;
//     // param["nums2"] = 22;
//     // rrp->setMethod("Add");
//     // rrp->setParams(param);
//     // std::string str = rrp->serialize();
//     // std::cout<< str <<std::endl;

//     // gmrpc::BaseMessage::ptr bmp = gmrpc::MessageFactory::create(gmrpc::MType::REQ_RPC);
//     // bool ret = bmp->unserialize(str);
//     // if(ret == false)
//     // {
//     //     return -1;
//     // }

//     // ret = bmp->check();
//     // if(ret == false)
//     // {
//     //     return -1;
//     // }

//     // gmrpc::RpcRequest::ptr rrp2 = std::dynamic_pointer_cast<gmrpc::RpcRequest>(bmp);
//     // std::cout << rrp2->method() <<std::endl;
//     // std::cout << rrp2->params()["nums1"].asInt() << std::endl;
//     // std::cout << rrp2->params()["nums2"].asInt() << std::endl;

//     // gmrpc::TopicRequest::ptr trp = gmrpc::MessageFactory::create<gmrpc::TopicRequest>();
//     // trp->setTopicKey("new");
//     // trp->setOptype(gmrpc::TopicOptype::TOPIC_PUBLISH);
//     // trp->setTopicMsg("Hello World");
//     // std::string str = trp->serialize();
//     // std::cout << str << std::endl;

//     // gmrpc::BaseMessage::ptr bmp = gmrpc::MessageFactory::create(gmrpc::MType::REQ_TOPIC);
//     // bool ret = bmp->unserialize(str);
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // ret = bmp->check();
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // gmrpc::TopicRequest::ptr trp2 = std::dynamic_pointer_cast<gmrpc::TopicRequest>(bmp);
//     // std::cout << trp2->topicKey() <<std::endl;
//     // std::cout << (int)trp2->optype() <<std::endl;
//     // std::cout << trp2->topicMsg() <<std::endl;

//     // gmrpc::ServiceRequest::ptr trp = gmrpc::MessageFactory::create<gmrpc::ServiceRequest>();
//     // trp->setMethod("Add");
//     // trp->setOptype(gmrpc::ServiceOptype::SERVICE_REGISTRY);
//     // trp->setHost(gmrpc::Address("127.0.0.1",9090));
//     // std::string str = trp->serialize();
//     // std::cout << str << std::endl;

//     // gmrpc::BaseMessage::ptr bmp = gmrpc::MessageFactory::create(gmrpc::MType::REQ_SERVICE);
//     // bool ret = bmp->unserialize(str);
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // ret = bmp->check();
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // gmrpc::ServiceRequest::ptr trp2 = std::dynamic_pointer_cast<gmrpc::ServiceRequest>(bmp);
//     // std::cout << trp2->method() << std::endl;
//     // std::cout << (int)trp2->optype() << std::endl;
//     // std::cout << trp2->host().first <<std::endl;
//     // std::cout << trp2->host().second<<std::endl;

//     // gmrpc::TopicResponse::ptr trp = gmrpc::MessageFactory::create<gmrpc::TopicResponse>();
//     // trp->setRCode(gmrpc::RCode::RCODE_OK);

//     // std::string str = trp->serialize();
//     // std::cout << str << std::endl;

//     // gmrpc::BaseMessage::ptr bmp = gmrpc::MessageFactory::create(gmrpc::MType::RSP_TOPIC);
//     // bool ret = bmp->unserialize(str);
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // ret = bmp->check();
//     // if (ret == false)
//     // {
//     //     return -1;
//     // }

//     // gmrpc::TopicResponse::ptr trp2 = std::dynamic_pointer_cast<gmrpc::TopicResponse>(bmp);
//     // std::cout << (int)trp2->rcode() << std::endl;

//     gmrpc::ServiceResponse::ptr trp = gmrpc::MessageFactory::create<gmrpc::ServiceResponse>();
//     trp->setRCode(gmrpc::RCode::RCODE_OK);
//     trp->setMethod("Add");
//     trp->setOptype(gmrpc::ServiceOptype::SERVICE_DISCOVERY);

//     std::vector<gmrpc::Address> addrs;
//     addrs.push_back(gmrpc::Address("127.0.0.1", 8888));
//     addrs.push_back(gmrpc::Address("127.0.0.1", 8889));
//     trp->setHost(addrs);
//     std::string str = trp->serialize();
//     std::cout << str << std::endl;

//     gmrpc::BaseMessage::ptr bmp = gmrpc::MessageFactory::create(gmrpc::MType::RSP_SERVICE);
//     bool ret = bmp->unserialize(str);
//     if (ret == false)
//     {
//         return -1;
//     }

//     ret = bmp->check();
//     if (ret == false)
//     {
//         return -1;
//     }

//     gmrpc::ServiceResponse::ptr trp2 = std::dynamic_pointer_cast<gmrpc::ServiceResponse>(bmp);
//     std::cout << (int)trp2->rcode() << std::endl;
//     std::cout << (int)trp2->optype() << std::endl;
//     std::cout << trp2->method() << std::endl;
//     std::vector<gmrpc::Address> addrs1 = trp2->hosts();
//     for (auto &addr : addrs1)
//     {
//         std::cout << addr.first << std::endl;
//         std::cout << addr.second << std::endl;
//     }
    
//     return 0;
// }
